package com.tedu.api.list;

import org.junit.Test;

import java.util.Date;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**包位置：java.util
 * Queue Deque 队列
 * 作用：实现数据的有序存储，用于数据缓冲，多线程协调线程使用
 * Collection顶级集合下子集：Queue集合接口
 */
public class QueueAPI {
    @Test
    public void testQueue(){
        //创建队列-自己使用功能
        Queue<String> queue=new LinkedList<>();
        /**
         * offer(E e)   返回值boolean---add一样
         * 作用：入队操作--队尾追加元素
         *
         */
        queue.offer("王菲");
        queue.offer("娜依娜");
        queue.offer("王源");
        queue.offer("749俊凯");
        System.out.println("队列："+queue);
        /**
         * poll() 返回值E
         * 作用：出队操作，获取队首元素，并且将元素从队列元素中删除
         */
        String str=queue.poll();
        str=queue.poll();
        System.out.println("队列出队"+str);
        System.out.println("队列"+queue);
        /**
         * peek() 返回值：E
         * 作用：出队操作，获取队首元素，不删除队列元素
         */
        str=queue.peek();//王菲
        System.out.println("队列出队：【peek】"+str);
        System.out.println("队列"+queue);
    }

    /**
     * 需求：队列--【历史名人】--遍历队列 while 队列中历史名人
     *                           【遍历之后元素清空】
     *                        遍历队列 增强for 队列中历史名人
     *                           【遍历之后元素清空】
     */
    @Test
    public void testHistory(){
        Queue<String> q=new LinkedList<>();
        q.offer("秦始皇");q.offer("王安石");q.offer("柳宗元");
        q.offer("汉武帝");
        //遍历1：while 队列中历史名人【遍历之后元素清空】
        while(q.size()>0){
            q.poll();//出队首，删除队首

        }
        System.out.println(""+q);
        //遍历2：增强for 队列中历史名人【遍历之后元素保存】
        for(String str:q){
          q.peek();
        }
        System.out.println("队列"+q);
    }
/**
 * 双端队列 Deque接口继承Queue接口
 * 作用：入队和出队操作--保存数据，可以在两端插入和删除元素
 * Deque接口中的方法：与Queue一致，拓展几个方法
 *
 *
 */
@Test
    public void testDeque(){
    //创建双端队列
    Deque<String> d=new LinkedList<>();
    d.add("苹果");d.add("香蕉");
    d.add("草莓");d.add("葡萄");
    System.out.println("Deque队列"+d);
    //双端增加：addFirst()给队首添加元素 addLast()给队尾添加元素
    d.addFirst("西瓜"); d.addFirst("草莓");
    System.out.println("双端队列"+d);
    //双端删除：poll peek
    d.pollFirst(); //pollFirst()出队队首，队列中队首删除
    System.out.println("删除队首"+d);
    d.peekFirst();
    System.out.println("不删除队首"+d);
    //获取队首元素---队首，队尾---getFirst\getLast
    System.out.println("队列【队首】"+d.getFirst());
    System.out.println("队列【队尾/ 】"+d.getLast());
 }
    /**
     * Deque支持栈结构【业务;撤销操作】
     * push()：压栈---功能：offer一致
     * pop：出栈---功能：pollLast 一致
     * --压栈：先进后出
     */
    @Test
    public void testStack(){
        Deque<String> stack=new LinkedList<>();
        stack.push("精卫");
        stack.push("后裔");
        stack.push("夸父");
        System.out.println("栈结构："+stack);
        String str=stack.pop(); //pop获取尾元素
        System.out.println("栈结构【出栈】"+str);
        System.out.println("双端队列"+stack);
    //队列中：pop poll peek方法使用特点
    //答：pop方法针对栈结构：
    //特点：针对双端队列最后添加元素【队首】获取队首元素
    //poll和peek是队内结构
    //特点：针对队列追加元素【队首】，poll获取队首元素并删除
        //                       peek获取队首元素并保存

    }
}
